// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-12-05

package filter

import "strings"

// Expression
// is a type name used to store filter conditions.
//
//   - status == 1
//   - status == 1 OR (status == 2 AND checks IN (1,2,3))
type Expression string

const (
	undefinedExpression = ""
)

// Split splits the conditions by `OR` then return a string list.
func (o Expression) Split() []string {
	nl := "\n"
	str := o.String()

	// Removes like follow:
	//
	// 1. new lines.
	// 2. left brackets.
	// 3. right brackets.
	str = strings.ReplaceAll(str, nl, " ")
	str = regexMatchBracketLeft.ReplaceAllString(str, afterReplacedBracketLeft)
	str = regexMatchBracketRight.ReplaceAllString(str, afterReplacedBracketRight)
	str = regexMatchLogicOr.ReplaceAllString(str, nl)
	return strings.Split(str, nl)
}

func (o Expression) String() string  { return string(o) }
func (o Expression) Undefined() bool { return o == undefinedExpression }
